package com.guohengspace.mq.service;

import com.aliyun.oss.model.Bucket;
import com.aliyun.oss.model.PartListing;
import com.guohengspace.mq.common.ResponseResult;
import com.guohengspace.mq.model.query.CheckFileMd5Param;
import com.guohengspace.mq.model.query.CompleteMultipartUploadParam;
import com.guohengspace.mq.model.query.UpLoadPartParam;
import com.guohengspace.mq.model.vo.CheckFileMd5Vo;

import java.util.List;

/**
 * 分片上传将要上传的文件分成若干个分片（Part）分别上传，所有分片都上传完成后，将所有分片合并成完整的文件，完成整个文件的上传。
 * 分片上传（Multipart Upload）分为以下三个步骤：
 * 1. 初始化一个分片上传事件。
 * 调用ossClient.initiateMultipartUpload方法返回OSS创建的全局唯一的uploadId。
 * 2. 上传分片。
 * 调用ossClient.uploadPart方法上传分片数据。
 * 说明
 * 对于同一个uploadId，分片号（partNumber）标识了该分片在整个文件内的相对位置。如果使用同一个分片号上传了新的数据，那么OSS上这个分片已有的
 * 数据将会被覆盖。
 * OSS将收到的分片数据的MD5值放在ETag头内返回给用户。
 * OSS计算上传数据的MD5值，并与SDK计算的MD5值比较，如果不一致则返回InvalidDigest错误码。
 * 3. 完成分片上传。
 * 所有分片上传完成后，调用ossClient.completeMultipartUpload方法将所有分片合并成完整的文件。
 */
public interface OssUploadPartService {


    ResponseResult<CheckFileMd5Vo> checkFileMd5(CheckFileMd5Param param);
    /**
     *
     * @param accessKeyId
     * @param accessKeySecret
     * @return
     */
    boolean  doesBucketExist (String accessKeyId,String accessKeySecret);

    /**
     *
     * @param accessKeyId
     * @param accessKeySecret
     */
    void putBucket(String accessKeyId,String accessKeySecret);

    /**
     *
     * @param accessKeyId
     * @param accessKeySecret
     * @param fileName
     * @return
     */
    String initiateMultipartUpload(String accessKeyId, String accessKeySecret, String fileName) ;

    /**
     *
     * @param upLoadPartParam
     * @return
     */
    ResponseResult<?> upLoadPart(UpLoadPartParam upLoadPartParam );

    /**
     *
     * @param upLoadPartParam
     * @return
     */
    ResponseResult<?> upLoadPartV2(UpLoadPartParam upLoadPartParam );

    /**
     *
     * @param param
     * @return
     */
    ResponseResult<?> completeMultipartUpload(CompleteMultipartUploadParam param );

    PartListing listpartsrequest(String uploadId, String accessKeyId, String accessKeySecret);

    List<Bucket> listBuckets (String accessKeyId, String accessKeySecret);

}
